/*
 * Title: PGA巡回赛的奖金（PGA Tour Prize Money)
 * Author: Yuanshun L
 * Created : 14-otc-2021
 * Question Description: 是否存在(r1,c1)和(r2,c1)相同，并且(r1,c2)和(r2,c2)相同
 */

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<cstring>
#include<cctype>
using namespace std;

#define RANK_WITH_MONEY 70

struct Player{
    char name[21];
    int scores[4];
    int rnd; // 有成绩的回合数
    int total; // 总分
    int flag; // 是否是业余选手
    Player(){
        memset(name,'\0',sizeof(name));
        for(int i=0;i<4;i++){
            scores[i]=-1;
        }
        rnd=0; total=-1;flag=0;
    }
};

bool cmp1(const Player& p1,const Player& p2); // 前两回合
bool cmp2(const Player& p1,const Player& p2); // 四回合
bool cmp3(const Player& p1,const Player& p2); // 会合数

int total_money;
vector<float> propotion;
vector<Player> players;
vector<Player> temp2;

// 读取名字
void read_name(char to[],char from[],int n,int &flag){
    int i; // 最后一个字母字符的位置
    for(i=n-1;i>=0;i--){
        if(from[i]=='*'){ flag=1; break; }
        if(isalpha(from[i])) break;
    }
    // 空串
    if(i<0){
        to[0] = '\0';
    }
    else{
        strncpy(to,from,i+1);
    }
}

// 按照输入格式打印
void print(vector<Player> &p){
    Player player;
    for(int i=0;i<p.size();i++){
        player = p[i];
        printf("%-20s",player.name);
        for(int j=0;j<4;j++){
            if(player.scores[j]>=0){
                printf("%-3d",player.scores[j]);
            }
            else break;
        }
        printf("--->%d \n",player.rnd);
    }
}

// 选择晋级的成员
vector<Player> select_make_the_cut(){
    vector<Player> temp;
    for(int i=0;i<players.size();i++){
        if(players[i].scores[0]>=0 && players[i].scores[1]>=0){
            temp.push_back(players[i]);
        }
    }
    if(temp.size()>70){
        sort(temp.begin(),temp.end(),cmp1);
        for(int i=70;i<temp.size();i++){
            if(temp[i].scores[0]+temp[i].scores[1] != temp[69].scores[0]+temp[69].scores[1]){
                temp.resize(i);break;
            }
        }
    }
    // 找到与70名并列的最后一位参赛者的排位
    return temp;
}


// 打印拿到奖金的选手信息
void print2(vector<Player> &p,int start,int end, float money,int rank){
    for(int i=start; i<=end;i++){
        if(start!=end) // 存在并列，则名次标记T
            printf("%-20s%dT ",p[i].name,rank);
        else
            printf("%-20s%d  ",p[i].name,rank);
        if(rank>9){
            printf("  ");
        }
        else{
            printf("   ");
        }
        for(int k=0;k<4;k++){ // 输出成绩
            printf("%-5d",p[i].scores[k]);
        } // 输出奖金
        printf("%-5d  ",p[i].total);
        if(!p[i].flag){
            printf("$%-.2f",money);
        }
        printf("\n");
    }
}

// 给有资格的选手分配奖金
void allocate_award(vector<Player> &p){
    int prop=0,rank=1,num,num2;// num为同排名的人数,num2为业余参赛者的人数
    float money;
    float total_prop;
    int size = p.size(); // 晋级参赛选手的数量
    sort(p.begin(),p.end(),cmp2);
    for(int i=0;i<size;i++){
        num=1,num2=0,total_prop=0;
        num2 += p[i].flag;
        for(int j=i+1;j<size;j++){
            if(p[i].total==p[j].total){
                num++;
                num2+=p[j].flag;
            }
            else break;
        }
        if(num==1){
            if(p[i].flag){
                money = 0;
            }
            else{
                money = propotion[prop] * total_money / 100;
                prop++; // 指向一下比例
            }
            print2(p,i,i,money,rank);
            rank++; // 下一个名次
        }
        else{
            int  n= num-num2;// 参与均分奖金的人数
            for(int k=prop;k<prop+n;k++){
                total_prop += propotion[k];
            }
            money = n>0 ? total_prop * total_money / 100 / n : 0;
            print2(p,i,i+num-1,money,rank);
            prop+=n;
            rank+=num;
            i+=num-1;
        }
    }
}

// 给没有拿到奖金但是晋级的选手的信息
void rank_of_players_without_award(vector<Player> &p){
    int size = p.size();
    sort(p.begin(),p.end(),cmp3);
    for(int i=0;i<size;i++){
        printf("%-20s",p[i].name);
        printf("      ");
        for(int j=0;j<4;j++){
            if(p[i].scores[j]<0) printf("%-5c",' ');
            else printf("%-5d",p[i].scores[j]);
        }
        printf("DQ     \n");
    }

}

int main(){
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);

    int n =  RANK_WITH_MONEY;
    float ppt=0.0;
    cin >> total_money; // 总奖金
    // 输入前70名奖金比例(百分比)
    while(n--){
        cin>>ppt;
        propotion.push_back(ppt);
    }

    string name,score_str,temp;
    char line[40];
    cin >> n; // 参赛人数
    getchar(); // 待完善
    while(n--){
        Player player;
        int sum=0,rnd=0,t=0,flag=0;
        fgets(line,41,stdin);
        // 获取名称，但是包含了最后的连续的空格，需要删除
        read_name(player.name,line,20,flag);
        player.flag=flag;
        int i,start;
        for(i=0;i<4;i++){
            start = 20+i*3;
            if(line[start]=='D'){
                break;
            }
            else{
                // 类型转换
                if(line[start+1] && line[start+1]!='\n' && line[start+1]!=' '){
                    t = (line[start] - '0')*10 + (line[start+1] - '0');
                }
                else{
                    t = line[start] - '0';
                }
                player.scores[i] = t;
                sum += t;
                rnd++;
            }
        }
        player.total = sum;
        player.rnd = rnd;
        players.push_back(player);
    }

    // 拿到晋级的参赛者
    temp2 = select_make_the_cut();

    vector<Player> temp3,temp4;

    // 对按照是否中途犯规区分晋级参赛选手
    for(int i=0;i<temp2.size();i++){
        if(temp2[i].rnd == 4) temp3.push_back(temp2[i]);
        else temp4.push_back(temp2[i]);
    }


    string name2="Player Name";
    printf("%-20sPlace RD1  RD2  RD3  RD4  TOTAL  Money Won\n",name2.c_str());
    printf("-----------------------------------------------------------------\n");
    allocate_award(temp3);

    rank_of_players_without_award(temp4);

    return 0;
}



// 比较前两回合的总成绩
bool cmp1(const Player& p1,const Player& p2){
    return p1.scores[0] + p1.scores[1] <  p2.scores[0] + p2.scores[1];
}

// 比较四回合总成绩
bool cmp2(const Player& p1,const Player& p2){
    int temp=0;
    temp = p1.total - p2.total;
    if(temp==0){
        return strcmp(p1.name,p2.name) <0;
    }
    return temp<0;
}

// 比较回合数、比较总分、比较名称
bool cmp3(const Player& p1,const Player& p2){
    if(p1.rnd !=p2.rnd)
        return p1.rnd > p2.rnd;
    else if(p1.total != p2.total)
        return p1.total > p2.total;
    else
        return strcmp(p1.name,p2.name) < 0;
}

